home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
program
/
arp68bk.zoo
/
arp.src
/
makefile.s
< prev
next >
Wrap
Makefile
|
1985-11-20
|
4KB
|
102 lines
; Program Name: MAKEFILE.S
; Version: 1.001
; Assembly Instructions:
; Assemble in PC-relative mode and save with a TOS suffix.
; Execution Instructions:
; This program is spawned by PRG_8CR.ACC. Both programs must reside in
; the same directory.
; Function:
; This program creates disk file specified in the first environmental string
; and stores therein the data contained in PRG_8CR.ACC's buffer. The purpose
; of this exercise is to illustrate an elegant method of creating a disk file
; for a desk accessory, writing data to the file and invoking proper file
; closure.
fetch_command_line_address:
lea -$82(pc), a3
fetch_environmental_string_address:
lea -$54(a3), a4 ; Fetch address of string pointer.
movea.l (a4), a4 ; Fetch address of string.
; The data in the command line is a string of eight ASCII hexadecimal digits
; passed from PRG_8CR.ACC when that program spawned this one. There are no
; characters before that string and none following. The string is the address
; of PRG_8CR.ACC's buffer, in which data that is to be written to a disk file
; has been stored. The address must be converted from an ASCII hexadecimal
; string to a binary longword.
; The data in the environmental string can be used as it exist.
process_command_line: ; Convert ASCII hexadecimal string to binary.
moveq.l #0, d0 ; Accumulator.
moveq.l #7, d2 ; Loop counter.
convert_string:
move.b (a3)+, d1 ; D1 is used for each character conversion.
cmpi.b #$39, d1 ; Character greater than 9 test.
bgt not_decimal
cmpi.b #$30, d1 ; Character less than 0 test.
blt not_valid
subi.b #$30, d1 ; Convert ASCII hex character to binary.
bra.s accumulate
not_decimal:
cmpi.b #$41, d1 ; Character less than A test.
blt not_valid
cmpi.b #$46, d1 ; Character greater than F test.
bgt not_valid
subi.b #$37, d1 ; Convert ASCII hex character to binary.
accumulate:
lsl.l #4, d0 ; Shift one nibble = one hex character.
add.b d1, d0
dbra d2, convert_string
move.l d0, a3 ; Address of buffer is in D0.
movea.l a3, a0 ; Copy for buffer byte count.
count_bytes_in_buffer:
moveq.l #0, d0 ; NULL byte test register.
moveq.l #0, d3 ; Byte count accumulator.
count:
move.b (a0)+, d0 ; Look at each character in buffer and
beq create_file ; accumulate count until NULL is found at
addq.l #1, d3 ; end of buffer.
bra.s count
create_file: ; COMPUTE! TOS book page 270.
move.w #0, -(sp) ; File attribute = read/write.
pea (a4) ; Environmental string has file's path.
move.w #$3C, -(sp) ; Function = f_create = GEMDOS $3C.
trap #1 ; File handle is returned in D0.
addq.l #8, sp
move.w d0, d4 ; Save file handle in D4.
write_buffer_to_file: ; Function = f_write. COMPUTE! TOS p.274.
pea (a3) ; Push buffer's address.
move.l d3, -(sp) ; Push byte count length.
move.w d4, -(sp) ; COMPUTE!'s TOS book incorrectly specifies
move.w #$40, -(sp) ; a longword operation here; see page 274.
trap #1
lea $C(sp), sp
close_output_file: ; COMPUTE! TOS book page 272.
move.w d4, -(sp) ; Push file handle.
move.w #$3E, -(sp) ; Function = GEMDOS $3E = f_close.
trap #1
addq.l #4, sp
not_valid:
terminate:
move.w #0, -(sp)
trap #1
data
align
bss
program_end: ds.l 0
end